package tec ;
import java.util.*;	

public class Autobus extends Bus
{
    private JaugeNaturel jaugeAssis;
    private JaugeNaturel jaugeDebout;
	private ArrayList<Passager> passagers;
    //private Passager[] passagers;
    private int nbPassagers ;
    private int numeroArret = 0;
	
    public Autobus(int nbPlaceAssise, int nbPlaceDebout)
    {
		if(nbPlaceAssise <0 || nbPlaceDebout <0)
			throw new IllegalArgumentException("Les nombres de place doivent etre positif");

		jaugeAssis  = new JaugeNaturel(0, nbPlaceAssise, 0);
		jaugeDebout = new JaugeNaturel(0, nbPlaceDebout, 0);
        nbPassagers = 0;
		passagers = new ArrayList<Passager>(nbPlaceAssise + nbPlaceDebout);//to add
       // passagers = new Passager[nbPlaceAssise + nbPlaceDebout];
    }
    
    public void allerArretSuivant() throws TecInvalidException,IllegalStateException{
       numeroArret++;
       /*Parcours du tableau à l'envers pour éviter les conflits
        * lors de la descente (suppresion d'un passager
        */
		PassagerAbstrait pa=null; 
		final Iterator<Passager> it = passagers.iterator();
		
		Bus b = new Bus() {   
		Iterator<Passager> ti=it;
		public void allerArretSuivant() throws TecInvalidException{}
		public boolean aPlaceAssise(){return Autobus.this.aPlaceAssise();}
		public boolean aPlaceDebout(){return Autobus.this.aPlaceDebout();}
		public void demanderChangerEnAssis(Passager p) throws IllegalStateException  {Autobus.this.demanderChangerEnAssis(p);} 
		public void demanderChangerEnDebout(Passager p) throws IllegalStateException {Autobus.this.demanderChangerEnDebout(p);}
   		public void demanderPlaceAssise(Passager p){Autobus.this.demanderPlaceAssise(p);}
   		public void demanderPlaceDebout(Passager p){Autobus.this.demanderPlaceDebout(p);}
		public void demanderSortie(Iterator<Passager> index,Passager p){
		    if(p.estDebout())
			jaugeDebout.decrementer();
		    else if (p.estAssis())
			jaugeAssis.decrementer();
		    p.accepterSortie();
		    index.remove();
		}

   		public void demanderSortie(Passager p){
			demanderSortie(ti,p);
		}
	};

		
       while(it.hasNext())
       {
		pa = (PassagerAbstrait) it.next();
		if(pa.getDestination()-numeroArret<0)
			throw new IllegalStateException();
        pa.nouvelArret(b,numeroArret);
       }
    
    }	
    
    public boolean aPlaceAssise()
    {
	return (!jaugeAssis.estRouge()); 
    }
    

    public boolean aPlaceDebout()
    {
	return (!jaugeDebout.estRouge());
    }	    
	
    protected void demanderChangerEnAssis(Passager p) throws IllegalStateException  
    { 
		if(p.estAssis())
			throw new IllegalStateException();
		if(aPlaceAssise())
       {
          p.accepterPlaceAssise();
          jaugeAssis.incrementer();
          jaugeDebout.decrementer();
       }
    }
	    
     protected void demanderChangerEnDebout(Passager p) throws IllegalStateException  
    { 	
		if(p.estDebout())
			throw new IllegalStateException();
		if(aPlaceDebout())
       {
          p.accepterPlaceDebout();
          jaugeAssis.decrementer();
          jaugeDebout.incrementer();
       }
          
    }

     protected void demanderPlaceAssise(Passager p)
    {
       if (aPlaceAssise())
       {
          p.accepterPlaceAssise();
		  boolean i = passagers.add(p);
		  if(i==false)
			System.err.println("Passager not add");
		  else{
          nbPassagers++;
          jaugeAssis.incrementer();
		  }
       }
    }


     protected void demanderPlaceDebout(Passager p)
    {
       if (aPlaceDebout())
       {
          p.accepterPlaceDebout();
          boolean i = passagers.add(p);
		  if(i==false)
			System.err.println("Passager not add");
		  else{
          nbPassagers++;
          jaugeAssis.incrementer();
		  }
       }
    }


     protected void demanderSortie(Passager p)
    {
	if(p.estDebout())
	    jaugeDebout.decrementer();
	else if (p.estAssis())
	    jaugeAssis.decrementer();

	p.accepterSortie();
    passagers.remove(p);
		/*for(int i = 0 ; i < nbPassagers ; i++)
           if(passagers[i] == p){
              passagers[i] = passagers[nbPassagers-1] ;
              passagers[nbPassagers-1] = null ;
              nbPassagers--;
              break;
           }*/
    }

    public String toString() {
       return "[arret:"+ numeroArret + ", assis:" + jaugeAssis +
          ", debout:" + jaugeDebout + "]";
    }

}
